interval |
您所在的位置:网站首页 › sqlorder by默认 › interval |
interval
语法 interval(X, duration, fill, [step], [explicitOffset=false], [closed], [label], [origin]) 详情 在 SQL 语句中,构建涵盖 X 所有数据的连续窗口以进行计算,其中每个窗口长度为 duration。对无数据的组,根据 fill 参数指定的方式填充缺失的计算结果。该函数只能在 SQL 的 group by 子句中使用,以实现插值查询,不能单独使用。 注:若SQL语句中指定where子句,条件中的时间类型支持自动转换。 参数 X 是一个向量,必须是整数或者时间类型。 duration 是一个整数或者 DURATION 类型。 duration 支持的时间单位(区分大小写):w, d, H, m, s, ms, us, ns。 对 X 以年或月进行分组时,需要调用 month 或 year 对 X 进行转换。 fill 是计算结果缺失值的填充方式,可取值为:”prev”, “post”, “linear”, “null”, “none” 和一个数字。 “prev”:使用前一个值填充。 “post”:使用后一个值填充。 “linear”:使用线性插值填充。对于非数值列,无法使用线性插值填充,这种情况下会使用 “prev” 的方式填充。 “null”:使用 null 值填充。 “none”:表示不进行插值。 一个数字:以该值填充。 New in version 2.00.1: 参数 step step 是可选参数,是一个整数或者 DURATION 类型,表示计算窗口每次向前滑动的步长,必须为一个可以整除 duration 的数。 通过 step 可以指定一个比 duration 更小的滑动步长。默认与 duration 设置值相同,即计算窗口以 duration 的步长滑动。 注:指定 step 后,不支持以下聚合计算:atImax, atImin, difference, imax, imin, lastNot, mode, percentile。 New in version 2.00.2: 参数 explicitOffset explicitOffset 是可选参数,是一个布尔值,表示第一个插值窗口起点是否为 where 条件指定的起始值。 closed 字符串,表示分组区间哪一个边界是闭合的。可取值为 ‘left’ 或 ‘right’。 label 字符串,表示将分组区间的哪一个边界作为 label 输出。可取值为 ‘left’ 或 ‘right’。 origin 字符串或与 X 具有相同时间类型的标量,表示基于时间戳调整分组。origin 为字符串时,可取以下值: ‘epoch’:分组起始点为1970-01-01。 ‘start’:分组起始点为时间序列的第一个值。 ‘start_day’:分组起始点是时间序列的第一个值对应日期的午夜零点。 ‘end’:分组起始点是时间序列的最后一个时间戳。 ‘end_day’:分组起始点是时间序列的最后一个时间戳对应日期的午夜24点(即下一日的零点)。 注意:若设置 explicitOffset = true,则不能设置 origin。 注:从 2.00.2 版本开始,取消了 range 参数。 下图以 duration = 2 * step 为例,进一步解释插值窗口如何进行滑动计算(结果为 NULL 的窗口需要根据 fill 参数指定的方式进行填充): 下图解释了 explicitOffset 不同设置下,插值起始窗口如何确定。图中 where 条件指定起始值为 t1,t1 前最近的一个能被 step 整除的值为 t0,当 explicitOffset 设置为 true 时,插值起始窗口以 t1 开始,当 explicitOffset 设置为 false 时,插值起始窗口以 t0 开始。 例子 使用前一个值填充: $ timestampv = temporalAdd(2012.01.01T00:00:00.000, [0, 1, 2, 4, 8, 9, 10, 11, 15, 20], "s") $ symbolv = take(`A`B`C, 10) $ a1v = double(1..10) $ t = table(timestampv as timestamp, symbolv as symbol, a1v as a1) $ select max(a1) from t group by interval(timestamp, 3s, "prev")interval_timestamp max_a1 2012.01.01T00:00:00.000 3 2012.01.01T00:00:03.000 4 2012.01.01T00:00:06.000 5 2012.01.01T00:00:09.000 8 2012.01.01T00:00:12.000 8 2012.01.01T00:00:15.000 9 2012.01.01T00:00:18.000 10 使用指定数字填充: $ select max(a1) from t group by interval(timestamp, 3s, 100)interval_timestamp max_a1 2012.01.01T00:00:00.000 3 2012.01.01T00:00:03.000 4 2012.01.01T00:00:06.000 5 2012.01.01T00:00:09.000 8 2012.01.01T00:00:12.000 100 2012.01.01T00:00:15.000 9 2012.01.01T00:00:18.000 10 下例中,以 2 年进行分组,需要将 X 的单位进行转换: $ t=table(1 3 NULL NULL 5 as price,2016.10.12T00:00:00.500 join 2017.10.12T00:00:03.000 join 2018.10.12T00:00:03.000 join 2019.10.12T00:00:08.000 join 2020.10.12T00:00:08.000 as time ) $ select max(price) from t group by interval(X=year(time), duration=2, fill="prev")interval max_price 2016 3 2018 3 2020 5 下例说明 explicitOffset 不同设置下,第一个窗口起始时间的显示值。 $ symbol = `C`C`C`C`C`C`MS`MS`MS`MS $ price= 29.6 29.46 29.52 30.02 30.17 30.23 50.76 50.32 51.29 53.23 $ volume = 2200 1900 2100 3200 6800 5400 1300 2500 8800 5800 $ date = [2012.01.01, 2012.01.01, 2012.01.01, 2012.01.03, 2012.01.05, 2012.01.06, 2012.01.02, 2012.01.02, 2012.01.04, 2012.01.06] $ second = [09:34:07,09:34:42,09:34:51,09:34:59,09:35:47,09:35:26,09:35:36,09:36:26,09:37:12,10:00:00] $ t = table(date, second, symbol, volume, price) //explicitOffset设置为true时,起始窗口以where指定的起始值09:33:50开始。 $ select max(volume) as max_volume, avg(price) as avg_price from t where second between 09:33:50:09:35:00 group by symbol, date, interval(X=second, duration=30, explicitOffset=true) as secondsymbol date second max_volume avg_price C 2012.01.01 09:33:50 2200 29.6 C 2012.01.01 09:34:20 1900 29.46 C 2012.01.01 09:34:50 2100 29.52 C 2012.01.03 09:33:50 C 2012.01.03 09:34:20 C 2012.01.03 09:34:50 3200 30.02 下例指定了 fill=”post”,则 where 指定的时间范围内出现缺失数据的窗口,将使用下一个窗口的计算结果进行填充。 $ select max(volume) as max_volume, avg(price) as avg_price from t where second between 09:33:50:09:35:00 group by symbol, date, interval(X=second, duration=30, fill="post", explicitOffset=true) as secondsymbol date second max_volume avg_price C 2012.01.01 09:33:50 2200 29.6 C 2012.01.01 09:34:20 1900 29.46 C 2012.01.01 09:34:50 2100 29.52 C 2012.01.03 09:33:50 3200 30.02 C 2012.01.03 09:34:20 3200 30.02 C 2012.01.03 09:34:50 3200 30.02 explicitOffset 设置为 false,第一个窗口的起始时间为 09:33:30,即 where 指定的起始时间(09:33:50)前第一个可以被 step 整除的时间点。本例中没有设置 step,它的取值与 duration 一样,第一个窗口起始时间计算方式为:second(09:33:50/30*30)。 $ select max(volume) as max_volume, avg(price) as avg_price from t where second between 09:33:50:09:35:00 group by symbol, date, interval(X=second, duration=30, fill="prev", explicitOffset=false) as secondsymbol date second max_volume avg_price C 2012.01.01 09:33:30 C 2012.01.01 09:34:00 2200 29.6 C 2012.01.01 09:34:30 2100 29.49 C 2012.01.01 09:35:00 2100 29.49 C 2012.01.03 09:33:30 2100 29.49 C 2012.01.03 09:34:00 2100 29.49 C 2012.01.03 09:34:30 3200 30.02 C 2012.01.03 09:35:00 3200 30.02 下例指定 step 为 20s,计算窗口长度为 60s,每 20s 向前滑动一次,进行计算。 $ select max(volume) as max_volume, avg(price) as avg_price from t where second between 09:33:50:09:35:00 group by symbol, date, interval(X=second, duration=60, fill=0, step=20, explicitOffset=false) as secondsymbol date second max_volume avg_price C 2012.01.01 09:33:40 2200 29.6 C 2012.01.01 09:34:00 2200 29.5267 C 2012.01.01 09:34:20 2100 29.49 C 2012.01.01 09:34:40 2100 29.49 C 2012.01.01 09:35:00 0 0 C 2012.01.03 09:33:40 0 0 C 2012.01.03 09:34:00 3200 30.02 C 2012.01.03 09:34:20 3200 30.02 C 2012.01.03 09:34:40 3200 30.02 C 2012.01.03 09:35:00 0 0 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |